home *** CD-ROM | disk | FTP | other *** search
GW-BASIC | 1987-01-11 | 8.8 KB | 329 lines |
- 10 '
- 20 ' *****************************************************
- 30 ' ** Program using graphics to demonstrate sorts **
- 40 ' ** by Joe Long Calhoun Community College **
- 50 ' ** Decatur, Alabama June 19, 1983 **
- 60 ' *****************************************************
- 70 '
- 80 CLS : PRINT "Copyright 1983 by Joe Long" : FOR I = 1 TO 2000 : NEXT I
- 82 PRINT "Not for Commercial use." : FOR I = 1 TO 2000 : NEXT I
- 85 LOCATE 12,10:PRINT "If you do not have the color graphic's adaptor "
- 86 LOCATE 14,10:PRINT "Then you can not enjoy this program. "
- 87 LOCATE 16,10:PRINT "Enter the letter ";CHR$(34);"Q";CHR$(34);" to Quit"
- 88 LOCATE 17,10,1:PRINT "or press <ENTER> to continue.";
- 90 A$=INKEY$:IF A$="" THEN 90 ELSE IF A$="q" OR A$="Q" THEN 9900
- 100 ' *** Initialize progam ***
- 110 '
- 120 DEFINT A-Z
- 130 KEY OFF : ON KEY (1) GOSUB 1000 : ON KEY (2) GOSUB 2000 : ON KEY (3) GOSUB 3000 : ON KEY (4) GOSUB 4000 : ON KEY (5) GOSUB 5000 : ON KEY (10) GOSUB 9900
- 140 KEY (1) ON : KEY (2) ON : KEY (3) ON : KEY (4) ON : KEY (5) ON : KEY (10) ON
- 150 RANDOMIZE(VAL(LEFT$(TIME$,2))*1000 + VAL(MID$(TIME$,3,2))*100 + VAL(RIGHT$(TIME$,2)))
- 160 DIM N(40)
- 165 DIM TIME.MEM#(5)
- 190 '
- 200 ' *** Main Menu Routines ***
- 210 '
- 220 IF TMP.TIME#>0 THEN TIME.MEM#(F.KEY)=ABS(TMP.TIME#-(VAL(RIGHT$(TIME$,2))+VAL(MID$(TIME$,4,2))*60))
- 221 SCREEN 0,1,0,0 : WIDTH 80 : COLOR 3,0,0 : CLS
- 230 PRINT TAB(32) "Sorting Technique"
- 240 PRINT : PRINT TAB(20) "Type of Sort"; TAB(60) "Function Key"
- 250 PRINT "SECONDS ";TAB(20) "------------"; TAB(60) "------------"
- 260 PRINT : PRINT TIME.MEM#(1); TAB(20) "Bubble Sort"; TAB(65) "F1"
- 270 PRINT : PRINT TIME.MEM#(2);TAB(20) "Delayed Replacement Sort"; TAB(65) "F2"
- 280 PRINT : PRINT TIME.MEM#(3); TAB(20) "Insertion Sort"; TAB(65) "F3"
- 290 PRINT : PRINT TIME.MEM#(4); TAB(20) "Shell-Metzner Sort"; TAB(65) "F4"
- 300 PRINT :PRINT TIME.MEM#(5); TAB(20) "Quicksort"; TAB(65) "F5"
- 310 PRINT : PRINT TAB(20) "Exit Program"; TAB(65) "F10"
- 320 PRINT : PRINT TAB(30) "Press Function key for choice."
- 330 Q$ = INKEY$ : GOTO 330
- 990 '
- 1000 F.KEY=1' *** Bubble Sort Demo ***
- 1010 '
- 1100 GOSUB 9200 ' prepare random # array
- 1110 GOSUB 6000 ' set up display
- 1190 '
- 1200 ' ** Sort array **
- 1210 '
- 1220 FOR I = 40 TO 2 STEP -1
- 1230 FOR J = 1 TO I-1
- 1240 P1 = J : P2 = J+1 ' ID points being compared for graphics subr.
- 1250 GOSUB 6200 ' Highlight points being compared
- 1260 IF N(J+1) > N(J) THEN 1310
- 1270 TEMP = N(J+1) ' Swap values
- 1280 N(J+1) = N(J)
- 1290 N(J) = TEMP
- 1300 GOSUB 6400 ' Plot swapped points
- 1310 Q$ = INKEY$ : IF Q$ <> "" THEN IF ASC(Q$) = 27 THEN RETURN 220
- 1320 NEXT J
- 1330 NEXT I
- 1340 'FOR DELAY = 1 TO 2000 : NEXT DELAY
- 1350 RETURN 220
- 1990 '
- 2000 F.KEY=2' *** Delayed Replacement Sort Demo ***
- 2010 '
- 2100 GOSUB 9200 ' prepare random # array
- 2110 GOSUB 6000 ' set up display
- 2190 '
- 2200 ' ** Sort array **
- 2210 '
- 2220 FOR I = 40 TO 2 STEP -1
- 2230 TRIAL = 1 ' Starting location for compare
- 2240 FOR J = 1 TO I
- 2250 P1 = TRIAL : P2 = J
- 2260 GOSUB 6200 ' Highlight compare
- 2270 IF N(J) > N(TRIAL) THEN TRIAL = J ' Find biggest value
- 2280 Q$ = INKEY$ : IF Q$ <> "" THEN IF ASC(Q$) = 27 THEN RETURN 220
- 2290 NEXT J
- 2300 TEMP = N(I) ' Swap values
- 2310 N(I) = N(TRIAL)
- 2320 N(TRIAL) = TEMP
- 2330 P1 = TRIAL : P2 = I
- 2340 GOSUB 6400 ' Highlight swap
- 2350 NEXT I
- 2360 'FOR DELAY = 1 TO 2000 : NEXT DELAY
- 2370 RETURN 220
- 2990 '
- 3000 F.KEY=3' *** Insertion Sort Demo ***
- 3010 '
- 3100 GOSUB 9200 ' prepare random # array
- 3110 GOSUB 6000 ' set up display
- 3190 '
- 3200 ' ** Sort array **
- 3210 '
- 3220 FOR I = 2 TO 40
- 3230 FOR J = I-1 TO 1 STEP -1 ' Find location for number
- 3240 Q$ = INKEY$ : IF Q$ <> "" THEN IF ASC(Q$) = 27 THEN RETURN 220
- 3250 P1 = I : P2 = J
- 3260 GOSUB 6200 ' Highlight compare
- 3270 IF N(I) > N(J) THEN 3290 ' Slot found
- 3280 NEXT J
- 3290 J = J + 1 ' Adjust J value
- 3300 TEMP = N(I) ' Hold number
- 3310 P2 = J
- 3320 GOSUB 6700
- 3330 FOR K = I TO J+1 STEP -1 ' Bump everybody up one slot
- 3340 N(K) = N(K-1)
- 3350 P1 = K - 1
- 3360 GOSUB 6800
- 3365 FOR DELAY = 1 TO 20 : NEXT DELAY
- 3370 NEXT K
- 3380 N(J) = TEMP ' Insert number
- 3390 GOSUB 6900
- 3400 NEXT I
- 3410 'FOR DELAY = 1 TO 2000 : NEXT DELAY
- 3420 RETURN 220
- 3990 '
- 4000 F.KEY=4' *** Shell-Metzner Sort Demo ***
- 4010 '
- 4100 GOSUB 9200 ' prepare random # array
- 4110 GOSUB 6000 ' set up display
- 4190 '
- 4200 ' ** Sort array **
- 4210 '
- 4220 M = 40 : N = 40 ' Array size
- 4230 M = INT(M/2) ' Divide array
- 4240 WHILE M > 0
- 4250 K = N-M
- 4260 J = 1
- 4270 I = J
- 4280 L = I + M
- 4290 P1 = L : P2 = I
- 4300 GOSUB 6200 ' Highlight compare
- 4310 Q$ = INKEY$ : IF Q$ <> "" THEN IF ASC(Q$) = 27 THEN RETURN 220
- 4320 IF N(L) > N(I) THEN 4390
- 4330 TEMP = N(I) ' Swap values
- 4340 N(I) = N(L)
- 4350 N(L) = TEMP
- 4360 GOSUB 6400 ' Highlight swap
- 4370 I = I - M
- 4380 IF I > 0 THEN 4280
- 4390 J = J + 1
- 4400 IF J > K THEN 4230 ELSE 4270
- 4410 WEND
- 4420 'FOR DELAY = 1 TO 2000 : NEXT DELAY
- 4430 RETURN 220
- 4910 '
- 5000 F.KEY=5:BEEP ' *** Quicksort Demo ***
- 5010 '
- 5100 GOSUB 9200 ' prepare random # array
- 5110 GOSUB 6000 ' set up display
- 5190 '
- 5200 ' ** Sort array **
- 5210 '
- 5220 D = 0 : L = 1 : R = 40 ' Initialize variables
- 5230 IF L >= R THEN 5320
- 5240 GOSUB 5400
- 5250 Q$ = INKEY$ : IF Q$ <> "" THEN IF ASC(Q$) = 27 THEN RETURN 220
- 5260 IF R1-L < L-R1 THEN 5300 ' Do smaller subarray first
- 5270 GOSUB 5800
- 5280 GOSUB 5850
- 5290 GOTO 5320
- 5300 GOSUB 5850
- 5310 GOSUB 5800
- 5320 IF D = 0 THEN 5370 ' Done
- 5330 L = L(D)
- 5340 R = R(D)
- 5350 D = D - 1
- 5360 GOTO 5230
- 5370 'FOR DELAY = 1 TO 2000 : NEXT DELAY
- 5380 RETURN 220
- 5390 '
- 5400 ' ** Partition array **
- 5410 '
- 5420 V = N(L)
- 5430 L1 = L + 1
- 5440 R1 = R
- 5450 FOR I = L1 TO R
- 5460 P1 = L : P2 = I
- 5470 GOSUB 6200
- 5490 IF N(I) > V THEN 5510
- 5500 NEXT I
- 5510 L1 = I
- 5520 FOR J = R1 TO L + 1 STEP -1
- 5530 P1 = L : P2 = J
- 5540 GOSUB 6200
- 5550 IF N(J)<V THEN 5580
- 5560 NEXT J
- 5580 R1 = J
- 5590 IF L1>R1 THEN 5680
- 5600 P1 = L1 : P2 = R1
- 5610 TEMP = N(L1)
- 5620 N(L1) = N(R1)
- 5630 N(R1) = TEMP
- 5640 GOSUB 6400
- 5660 GOTO 5450
- 5680 N(L) = N(R1) ' Put partition value in place
- 5690 N(R1) = V
- 5700 P1 = L : P2 = R1
- 5710 GOSUB 6400
- 5720 RETURN
- 5800 ' ** Load left sub-array **
- 5810 D = D + 1
- 5820 L(D) = L
- 5830 R(D) = R1 - 1
- 5840 RETURN
- 5850 ' ** Load right sub-array **
- 5860 D = D + 1
- 5870 L(D) = R1 + 1
- 5880 R(D) = R
- 5890 RETURN
- 5990 '
- 6000 ' *** Graphics Routines ***
- 6010 '
- 6020 CLS : SCREEN 1,0 : COLOR 1,0
- 6030 BLOCK(0) = 16 : BLOCK(1) = 3 ' Define shape of block for PUT statement
- 6040 FOR I = 2 TO 4 : BLOCK(I) = -21846 : NEXT I
- 6050 BLOCKSWAP(0) = 16 : BLOCKSWAP(1) = 3 ' Define block for swapping
- 6060 FOR I = 2 TO 4 : BLOCKSWAP(I) = -1 : NEXT I
- 6070 BACKGROUND(0) = 16 : BACKGROUND(1) = 3 ' Define block for erasing
- 6080 FOR I = 2 TO 4 : BACKGROUND(I) = 0 : NEXT I
- 6085 TMP.TIME#=VAL(RIGHT$(TIME$,2))+VAL(MID$(TIME$,4,2))*60
- 6090 '
- 6100 ' ** Put random # array on screen **
- 6110 '
- 6120 FOR I = 1 TO 40
- 6130 X = 8*(I-1)
- 6140 Y = 124-3*N(I)
- 6150 PUT (X,Y), BLOCK, PSET
- 6160 NEXT I
- 6170 LOCATE 22,6 : PRINT "Press <Esc> to return to menu"
- 6180 RETURN
- 6190 '
- 6200 ' ** Highlight points being compared **
- 6210 '
- 6220 X = 8*(P1-1)
- 6230 Y = 124-3*N(P1)
- 6240 X1 = 8*(P2-1)
- 6250 Y1 = 124-3*N(P2)
- 6260 PUT (X,Y), BLOCK, PRESET
- 6270 PUT (X1,Y1), BLOCK, PRESET
- 6280 LOCATE 20,15 : PRINT "COMPARING . . . "
- 6290 FOR DELAY = 1 TO 200 : NEXT DELAY
- 6300 PUT (X,Y), BLOCK, PSET
- 6310 PUT (X1,Y1), BLOCK, PSET
- 6320 LOCATE 20,15 : PRINT SPACE$(34)
- 6380 RETURN
- 6390 '
- 6400 ' ** Highlight swapped points **
- 6410 '
- 6420 X = 8*(P1-1)
- 6430 Y = 124-3*N(P1)
- 6440 X1 = 8*(P2-1)
- 6450 Y1 = 124-3*N(P2)
- 6460 PUT (X,Y1), BLOCKSWAP, PSET
- 6470 PUT (X1,Y), BLOCKSWAP, PSET
- 6480 LOCATE 18,P1 : PRINT "^"; : LOCATE 18,P2 : PRINT "^"
- 6490 LOCATE 19,P1 : PRINT "|"; : LOCATE 19,P2 : PRINT "|"
- 6500 LOCATE 20,15 : PRINT "SWAPPING . . . "
- 6510 FOR DELAY = 1 TO 500 : NEXT DELAY
- 6520 PUT (X,Y1), BACKGROUND, PSET
- 6530 PUT (X1,Y), BACKGROUND, PSET
- 6540 PUT (X,Y), BLOCKSWAP, PSET
- 6550 PUT (X1,Y1), BLOCKSWAP, PSET
- 6560 FOR DELAY = 1 TO 300 : NEXT DELAY
- 6570 PUT (X,Y), BLOCK, PSET
- 6580 PUT (X1,Y1), BLOCK, PSET
- 6590 LOCATE 18,1 : PRINT SPACE$(40);
- 6600 LOCATE 19,1 : PRINT SPACE$(40);
- 6610 LOCATE 20,15 : PRINT SPACE$(34);
- 6620 RETURN
- 6690 '
- 6700 ' ** Highlight point to be inserted **
- 6710 '
- 6720 X = 8*(P1-1)
- 6730 Y = 124-3*N(P1)
- 6740 X1 = 8*(P2-1)
- 6750 PUT (X,Y), BACKGROUND, PSET
- 6760 PUT (X1,Y), BLOCKSWAP, PSET
- 6770 RETURN
- 6790 '
- 6800 ' ** Bump points up for insertion **
- 6810 '
- 6820 X = 8*(P1-1) : Y = 124-3*N(P1)
- 6830 PUT (X+8,Y), BACKGROUND, PSET
- 6840 PUT (X,Y), BLOCKSWAP, PSET
- 6850 LOCATE 20,15 : PRINT "Bumping . . . "
- 6860 PUT (X+8,Y), BLOCKSWAP, PSET
- 6870 PUT (X,Y), BACKGROUND, PSET
- 6880 PUT (X+8,Y), BLOCK, PSET : RETURN
- 6890 '
- 6900 ' ** Insert point **
- 6910 '
- 6920 LOCATE 20,15 : PRINT "Insert . . . "
- 6930 X = 8*(I-1) : Y = 124-3*N(P1)
- 6940 X1 = 8*(P2-1)
- 6950 PUT (X,Y), BACKGROUND, PSET
- 6960 PUT (X1,Y), BLOCK, PSET
- 6970 RETURN
- 6990 '
- 8990 '
- 9000 ' *** Miscellaneous Subroutines ***
- 9010 '
- 9100 ' ** Process Yes/No Inputs **
- 9110 '
- 9120 Q$ = ""
- 9130 WHILE Q$ = "" : WEND
- 9140 IF Q$ <> "Y" AND Q$ <> "y" AND Q$ <> "N" AND Q$ <> "n" THEN BEEP : GOTO 9120
- 9150 IF Q$ = "Y" OR Q$ = "y" THEN YES = 1 ELSE YES = 0
- 9160 IF YES = 1 THEN PRINT "Yes" ELSE PRINT "No"
- 9170 RETURN
- 9190 '
- 9200 ' ** Fill array with random numbers **
- 9210 '
- 9220 FOR I = 1 TO 40 ' Fill array with ordered numbers
- 9230 N(I) = I
- 9240 NEXT I
- 9250 FOR I = 40 TO 2 STEP -1 ' Scramble array
- 9260 EXCHANGE = INT(RND*(I)+1)
- 9270 TEMP = N(I)
- 9280 N(I) = N(EXCHANGE)
- 9290 N(EXCHANGE) = TEMP
- 9300 NEXT I
- 9310 RETURN
- 9890 '
- 9900 ' ** End of program routine **
- 9910 '
- 9920 SCREEN 0,1,0 : COLOR 6,0,0 : CLS
- 9930 'Program uploaded to CPCUG on 26 July by Joe Long Madison AL.
- 9940 END
-